#include "dohttp.h"

void* doHttpRequest(void* pClientSock)
{
	//读取客户端发送的http请求
	int len=0;//读到的字符个数
	char buf[256];//请求行
	char method[64];//存放请求方法
	char url[256];//请求url
	char path[256];
	struct stat st;
	int client_sock = *(int *)pClientSock;
	// 1、读取请求行
	len = getLine(client_sock, buf, sizeof(buf));

	//2、
	int i=0, j=0;
	if(len>0)//读到请求行
	{
		while(!isspace(buf[j]) && i<sizeof(method)-1)
		{
			method[i]=buf[j];
			i++; j++;
		}
		method[i]='\0';
		printf("request method: %s\n", method);
		if(strncasecmp(method, "get", i)==0)//只处理get请求
		{
			// if(debug)	printf("method = GET\n");
			//获取url
			while(isspace(buf[j++]))//跳过空格
			i=0;
			while(!isspace(buf[j]) && i<sizeof(url)-1)
			{
				url[i]=buf[j];
				i++; j++;
			}
			url[i]='\0';
			if(debug) printf("url: %s\n", url);
			//继续读取http头部
			do
			{
				len = getLine(client_sock, buf, sizeof(buf));
				if(debug) printf("%s\n", buf);
			}while(len>0);

			//************定位服务器本地的html文件********
			//处理url的?
			char *pos=strchr(url, '?');
			if(pos)	*pos='\0';
			printf("real url:%s\n", url);
			sprintf(path, "./html_docs/%s", url);
			if(debug)	printf("path:%s\n", path);
			
			//***********执行http响应*************
			//判断文件是否存在，如果存在就响应200 OK，同时发送响应的html 如果不存在，则响应404 NOT FOUND

			if(stat(path, &st)==-1)//文件不存在或出错 返回-1
			{
				fprintf(stderr, "stat %s failed reason:%s", path, strerror(errno));
				not_found(client_sock);
			}
			else//文件存在
			{
				if(S_ISDIR(st.st_mode))//判断是否是一个目录
					strcat(path, "/index.html");
				doHttpResponse(client_sock, path);
			}
		}
		else//非get请求， 读取http头部并响应（501）
		{
			fprintf(stderr, "warning! other request [%s]\n", method);
			do
			{
				len = getLine(client_sock, buf, sizeof(buf));
				if(debug) printf("%s\n", buf);
			}while(len>0);
			unimplemented(client_sock);//请求未实现
		}
	}
	else//请求格式有问题，出错处理
	{
		badRequest(client_sock);
	}
	close(client_sock);
	if(pClientSock) free(pClientSock);//释放动态分配的内存
	return NULL;
}
void doHttpResponse(int client_sock, const char* path)
{
	int ret=0;
	FILE * resource=NULL;
	resource=fopen(path, "r");
	if(resource==NULL)
	{
		not_found(client_sock);
		return;
	}
	//1、发送http头部
	ret = headers(client_sock, resource);

	//2、发送http body
	if(!ret)
		cat(client_sock, resource);

	fclose(resource);
}